package cn.aws360.boot.data.api.pojo.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author junnan
 */
@Data
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidProperties {

    /**
     * 数据驱动名称，可选配置，会自动识别
     */
    private String driverClassName;

    /**
     * 连接数据库的 URL
     */
    private String url;

    /**
     * 连接数据库的用户名
     */
    private String username;

    /**
     * 连接数据库的密码
     */
    private String password;


    /**
     * 初始化时建立物理连接的个数
     */
    private Integer initialSize = 2;

    /**
     * 最大连接池数量
     */
    private Integer maxActive = 20;

    /**
     * 最小连接池数量
     */
    private Integer minIdle = 1;

    /**
     * 获取连接时最大等待时间，单位毫秒，配置了 maxWait 之后，缺省启用公平锁，并发效率会有所下降。
     * 如果需要可以通过配置 useUnfairLock 属性为 true 使用非公平锁。
     */
    private Integer maxWait = 60000;

    /**
     * 是否缓存 preparedStatement，也就是 PSCache，PSCache 对支持游标的数据库性能提升巨大，比如说 oracle，在 mysql 下建议关闭。
     */
    private Boolean poolPreparedStatements = false;

    /**
     * 要启用 PSCache，必须配置大于0，可以配置-1关闭。
     * 当大于0时，poolPreparedStatements 自动触发修改为 true。
     * 在 Druid 中，不会存在 Oracle 下 PSCache 占用内存过多的问题，可以把这个数值配置大一些，比如说 100。
     */
    private Integer maxPoolPreparedStatementPerConnectionSize = -1;

    /**
     * 用来检测连接是否有效的 sql，要求是一个查询语句，常用 select 'x'。
     * 如果 validationQuery 为 null，testOnBorrow、testOnReturn、testWhileIdle 都不会起作用。
     */
    private String validationQuery = "select 1";

    /**
     * 检测连接是否有效的超时时间，单位秒，底层调用 jdbc Statement 对象的 void setQueryTimeout(int seconds) 方法。
     */
    private Integer validationQueryTimeout = 10;

    /**
     * 申请连接时执行 validationQuery 检测连接是否有效，做了这个配置会降低性能。
     */
    private Boolean testOnBorrow = false;

    /**
     * 归还连接时执行 validationQuery 检测连接是否有效，做了这个配置会降低性能。
     */
    private Boolean testOnReturn = false;

    /**
     * 建议配置为 true，不影响性能，并且保证安全性。
     * 申请连接的时候检测，如果空闲时间大于 timeBetweenEvictionRunsMillis，执行 validationQuery 检测连接是否有效。
     */
    private Boolean testWhileIdle = true;

    /**
     * 连接池中的 minIdle 数量以内的连接，空闲时间超过 minEvictableIdleTimeMillis，则会执行 keepAlive 操作。
     */
    private Boolean keepAlive = false;

    /**
     * 有两个含义：
     * 1) Destroy 线程会检测连接的间隔时间，如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接。
     * 2) testWhileIdle 的判断依据，详细看 testWhileIdle 属性的说明。
     */
    private Integer timeBetweenEvictionRunsMillis = 60000;

    /**
     * 连接保持空闲而不被驱逐的最小时间。
     */
    private Integer minEvictableIdleTimeMillis = 300000;

    /**
     * 属性类型是字符串，通过别名的方式配置扩展插件，常用的插件有：
     * 监控统计用的 filter:stat
     * 日志用的 filter:log4j
     * 防御 sql 注入的 filter:wall
     */
    private String filters = "stat";


    /**
     * druid urlMappings 默认值
     */
    private String urlMappings = "/druid/*";

    /**
     * druid resetEnable 默认值
     */
    private String resetEnable = "false";

    /**
     * druid admin LoginUsername 默认值
     */
    private String adminLoginUsername = "root";

    /**
     * druid admin LoginPassword 默认值
     */
    private String adminLoginPassword = "root";

    /**
     * druid admin WebStatFilterUrlPattern 默认值
     */
    private String adminWebStatFilterUrlPattern = "/*";

    /**
     * druid admin WebStatFilterExclusions 默认值
     */
    private String adminWebStatFilterExclusions = "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*";

    /**
     * druid admin WebStatFilterSessionStatEnable 默认值
     */
    private String adminWebStatFilterSessionStatEnable = "false";

    /**
     * druid admin WebStatFilterSessionStatMaxCount 默认值
     */
    private String adminWebStatFilterSessionStatMaxCount = "1000";

    /**
     * druid admin WebStatFilterPrincipalCookieName 默认值
     */
    private String adminWebStatFilterPrincipalCookieName = "";

    /**
     * druid admin WebStatFilterPrincipalSessionName 默认值
     */
    private String adminWebStatFilterPrincipalSessionName = "";

    /**
     * druid admin WebStatFilterProfileEnable 默认值
     */
    private String adminWebStatFilterProfileEnable = "true";

}
